/**
 * 文件名：@SoaClientFeignFactoryBean.java <br/>
 * 包名：cn.efunbox.afw.soa.client.netflix.feign <br/>
 * 项目名：afw-soa <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.soa.client.netflix.feign;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.cloud.netflix.feign.FeignClientFactoryBeanAdapter;
import org.springframework.cloud.netflix.feign.FeignContext;
import org.springframework.util.StringUtils;

/**
 * 类名：SoaClientFeignFactoryBean  <br />
 *
 * 功能：SoaService feign客户端工厂类
 *
 * @author xtwin <br />
 * 创建时间：2016年7月24日 下午9:31:36  <br />
 * @version 2016年7月24日
 */
public class SoaClientFeignFactoryBean extends FeignClientFactoryBeanAdapter implements FactoryBean<Object> {
	
	// 配置名称
	protected String configName;

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月24日 下午9:32:00<br/>
	 * 
	 * @param context
	 * @param type
	 * @return <br/>
	 * @see org.springframework.cloud.netflix.feign.FeignClientFactoryBean#get(org.springframework.cloud.netflix.feign.FeignContext, java.lang.Class)
	 */
	@Override
	protected <T> T get(FeignContext context, Class<T> type) {
		T instance = getOptional(context, type);
		
		if (instance == null) {
			throw new IllegalStateException("No bean found of type " + type + " for " + configName);
		}
		return instance;
	}
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月24日 下午9:34:22<br/>
	 * 
	 * @param context
	 * @param type
	 * @return <br/>
	 * @see org.springframework.cloud.netflix.feign.FeignClientFactoryBean#getOptional(org.springframework.cloud.netflix.feign.FeignContext, java.lang.Class)
	 */
	protected <T> T getOptional(FeignContext context, Class<T> type) {
		return context.getInstance(configName, type);
	}
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月24日 下午9:35:17<br/>
	 * 
	 * @throws Exception <br/>
	 * @see org.springframework.cloud.netflix.feign.FeignClientFactoryBean#afterPropertiesSet()
	 */
	@Override
	public void afterPropertiesSet() throws Exception {
		super.afterPropertiesSet();
		
		if (StringUtils.isEmpty(configName)) {
			configName = "SOA_SERVICE:" + getName();
		}
	}

	/**
	 * @version 2016年7月24日-下午10:06:55
	 */
	public void setConfigName(String configName) {
		this.configName = configName;
	}
}